/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"

#include "渲染器视口工作区.h"


#include "A_引擎/引擎.h"
#include "框架/工作区/节点视口/ui渲染合成节点菜单.h"
#include "框架/工作区/节点视口/ui节点创建菜单.h"

#include "../ui属性栏.h"
#include "ui渲染器面板卡片.h"
#include "框架/工作区/通用弹出菜单.h"


#include <几何图形/图形相交.h>
#include <节点/空间/场景信息.h>



//static C_Widget* g_创建弹出菜单 = nullptr;





class C_渲染视口状态条 : public C_状态条 {

public:
	C_渲染视口状态条(S_UI创建环境& ctx) : C_状态条(ctx) {
		m_View = nullptr;
	}

	S_Props		m_当前工作区节点树容器映射;
	C_节点视口* m_View;

};



static void f_PropUpdate_返回上一级节点树(S_Props& prop) {
	C_渲染视口状态条* bar = static_cast<C_渲染视口状态条*>(prop.m_UI->m_部件->m_父部件->m_父部件);
	/*C_节点基类* node = bar->m_View->m_节点树后端->f_get父节点();
	if (node) {
		bar->m_View->f_绑定节点树(node->m_当前节点的子节点树);
	}*/
}

static void on_节点树列表_项改变(S_Props& prop, S_MapPtr& ptrItem, int32 操作类型) {
	C_渲染视口状态条* bar = static_cast<C_渲染视口状态条*>(prop.m_UI->m_部件->m_父部件->m_父部件);

	if (操作类型 > 0) {
		uint32 offset = 操作类型 - 1;
		S_MapPtrItem& item = ptrItem.m_PtrItem[offset];
		bar->m_View->f_绑定节点树((C_节点树*)item.m_Ptr);
	}
	else if (操作类型 < 0) {
		ptrItem.m_PtrItem.erase(ptrItem.m_PtrItem.begin() + ptrItem.m_当前项);
	}
	else {
		S_MapPtrItem item;
		C_节点树* t = f_node_Create渲染节点树(true);
		item.m_Ptr = t;
		//item.m_Str = &(t->m_IDName);
		item.m_Str = t->m_IDName;
		ptrItem.m_PtrItem.push_back(item);

		bar->m_View->f_绑定节点树(t);
	}
}




static bool f_鼠标按下(C_Widget* self, const E_鼠标按钮& 按钮) {

	return false;
}

static bool f_鼠标放开(C_Widget* self, const E_鼠标按钮& 按钮) {
	
	return false;
}

static bool f_鼠标位置改变(C_Widget* self, const ivec4& mouse) {
	
	return true;
}

static bool f_鼠标滚轮(C_Widget* self, const S_鼠标& 轮值) {
	
	return true;
}

static bool on_3D视口键盘按键按下(C_Widget* self, const S_键盘& ks) {
	
	return false;
}










void f_工作区页面_渲染合成节点工作区初始化(S_UI创建环境& ctx) {
	C_节点视口::g渲染节点创建菜单 = f_init渲染合成节点创建菜单(ctx);
	f_init_渲染合成节点创建_绑定视口回调(f_NodeView_其他工作区添加面板到视口);
}

C_工作区页面* f_工作区页面_创建渲染器视口(S_UI创建环境& ctx) {

	auto 状态条 = new C_渲染视口状态条(ctx);

	状态条->m_当前工作区节点树容器映射 = f_alloc_StrIndexProp(S_节点数据::g_渲染节点树, L"");
	状态条->m_当前工作区节点树容器映射.m_UI->m_Update = on_节点树列表_编辑名称;
	auto& p = f_prop_MapPrt(状态条->m_当前工作区节点树容器映射);
	p.mf_元素变更 = on_节点树列表_项改变;

	C_节点树* t = nullptr;
	if (p.m_PtrItem.size()) {
		t = (C_节点树*)p.m_PtrItem.back().m_Ptr;
	}
	else {
		t = f_node_Create渲染节点树(true, L"渲染合成节点");
	}

	auto* nodeview = f_NodeView_创建节点窗口(ctx, t);
	nodeview->m_节点树容器 = 状态条->m_当前工作区节点树容器映射;
	nodeview->m_节点菜单 = C_节点视口::g渲染节点创建菜单;
	nodeview->m_节点删除菜单 = f_通用菜单_节点删除菜单(ctx, on_NodeView_删除节点菜单项);
	nodeview->mf_以节点构建节点 = f_渲染合成节点构建_从节点构建节点;
	nodeview->mf_节点重构回调 = f_渲染合成节点构建_重构;
	nodeview->mf_名称构建节点面板 = f_节点构建_用名称构建节点面板;

	状态条->m_View = nodeview;

	auto* 滚动窗口 = f_ui_创建滚动框(ctx, true, true, nodeview);
	滚动窗口->mf_鼠标滚轮 = nullptr;


	C_工作区页面* 工作区 = new C_工作区页面(E_工作区类型::e_渲染合成视口, ctx, E_方向::e_横向, 滚动窗口, 状态条, nodeview->m_属性栏);

	f_渲染器视口工作区_重构状态条(工作区->m_状态条);
	
    return 工作区;
}



void f_渲染器视口工作区_重构状态条(C_状态条* 状态条) {
	C_渲染视口状态条* bar = static_cast<C_渲染视口状态条*>(状态条);

	std::vector<S_Props> props;
	S_Props	prop;

	prop = f_alloc_OpsProp(f_PropUpdate_返回上一级节点树, L"返回上一级");
	props.push_back(prop);

	props.push_back(f_alloc_NoneProp());

	props.push_back(bar->m_当前工作区节点树容器映射);

	props.push_back(f_alloc_NoneProp());

	props.push_back(prop);

	状态条->f_构建属性部件(props, 状态条);
}

void f_渲染器视口工作区_保存工作区状态(FILE* f, C_工作区页面* 页面) {
	C_渲染视口状态条* bar = static_cast<C_渲染视口状态条*>(页面->m_状态条);

	S_MapPtr& 映射项 = f_prop_MapPrt(bar->m_当前工作区节点树容器映射);
	fwrite(&映射项.m_当前项, sizeof(映射项.m_当前项), 1, f);
	fwrite(bar->m_View->m_扩展视口属性, sizeof(S_View属性), 1, f);
}

void f_渲染器视口工作区_加载工作区状态(FILE* f, C_工作区页面* 页面) {
	C_渲染视口状态条* bar = static_cast<C_渲染视口状态条*>(页面->m_状态条);

	S_MapPtr& 映射项 = f_prop_MapPrt(bar->m_当前工作区节点树容器映射);
	fread(&映射项.m_当前项, sizeof(映射项.m_当前项), 1, f);
	fread(bar->m_View->m_扩展视口属性, sizeof(S_View属性), 1, f);

	bar->m_View->f_绑定节点树((C_节点树*)S_节点数据::g_渲染节点树[映射项.m_当前项].m_Ptr);

}








